package math2;

/**
 * /** %%%%%%%%%%%%%%%%%% T6 SIX NODE TRIANGULAR ELEMENT %%%%%%%%%%%%%%%%%% % %
 * 3 % / \ % / \ % / \ % / \ % 6 5 % / \ % / \ % / \ % / \ % 1------4-------2
 * 
 * refer to lagrange_basis.m
 * 
 * @author hbui
 * 
 */
public class LagrangeFBOnT6 extends PolynomialBasisOnRnToR {

	public LagrangeFBOnT6() {

		addBasisFunction(
		/*
		 * N1 = 1-3*(xi+eta)+4*xi*eta+2*(xi^2+eta^2)
		 */
		new FunctionRnToR() {

			@Override
			public double valueAt(double... psi) {
				double xi = psi[0];
				double eta = psi[1];
				return 1 - 3 * (xi + eta) + 4 * xi * eta + 2 * (xi * xi + eta * eta);
			}

			@Override
			public double[] gradientAt(double... psi) {
				double xi = psi[0];
				double eta = psi[1];
				return new double[] { 4 * (xi + eta) - 3, 4 * (xi + eta) - 3 };
			}
		},
		/*
		 * N2 = xi*(2*xi-1)
		 */
		new FunctionRnToR() {

			@Override
			public double valueAt(double... psi) {
				double xi = psi[0];
				return xi * (2 * xi - 1);
			}

			@Override
			public double[] gradientAt(double... psi) {
				double xi = psi[0];
				return new double[] { 4 * xi - 1, 0 };
			}
		},
		/*
		 * N3 = eta*(2*eta-1)
		 */
		new FunctionRnToR() {

			@Override
			public double valueAt(double... psi) {
				double eta = psi[1];
				return eta * (2 * eta - 1);
			}

			@Override
			public double[] gradientAt(double... psi) {
				double eta = psi[1];
				return new double[] { 0, 4 * eta - 1 };
			}
		},
		/*
		 * N4 = 4*xi*(1-xi-eta)
		 */
		new FunctionRnToR() {

			@Override
			public double valueAt(double... psi) {
				double xi = psi[0];
				double eta = psi[1];
				return 4 * xi * (1 - xi - eta);
			}

			@Override
			public double[] gradientAt(double... psi) {
				double xi = psi[0];
				double eta = psi[1];
				return new double[] { 4 * (1 - eta - 2 * xi), -4 * xi };
			}
		},
		/*
		 * N5 = 4*xi*eta
		 */
		new FunctionRnToR() {

			@Override
			public double valueAt(double... psi) {
				double xi = psi[0];
				double eta = psi[1];
				return 4 * xi * eta;
			}

			@Override
			public double[] gradientAt(double... psi) {
				double xi = psi[0];
				double eta = psi[1];
				return new double[] { 4 * eta, 4 * xi };
			}
		},
		/*
		 * N6 = 4*eta*(1-xi-eta)
		 */
		new FunctionRnToR() {

			@Override
			public double valueAt(double... psi) {
				double xi = psi[0];
				double eta = psi[1];
				return 4 * eta * (1 - xi - eta);
			}

			@Override
			public double[] gradientAt(double... psi) {
				double xi = psi[0];
				double eta = psi[1];
				return new double[] { -4 * eta, 4 * (1 - xi - 2 * eta) };
			}
		});
	}

	@Override
	public int getP() {
		return 2;
	}

	@Override
	public void setP(int p) {
	}

	@Override
	public Object clone() {
		return new LagrangeFBOnT6();
	}
}
